perm filename PRED4.FAI[SYS,HE] blob sn#009300 filedate 1972-12-06 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00009 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	TITLE EULER  -  EULER SURFACE SUBROUTINES  -  JULY 1972.
 00003 00003	SUBR(INVERT)	AC-TRANSPARENT.
 00004 00004	SUBR(MKEV)
 00006 00005	ENEW ← MKFE(V1,F,V2)		"J" COMMAND.
 00008 00006	CDR V2'S TAIL REPLACING +F WITH FNEW.
 00009 00007	VNEW ← ESPLIT(E)		"M" COMMAND.
 00011 00008	E ← KLEV(VNEW)		"K" COMMAND.
 00013 00009	F ← KLFE(ENEW)		"K" COMMAND.
 00016 ENDMK
⊗;
TITLE EULER  -  EULER SURFACE SUBROUTINES  -  JULY 1972.
COMMENT /
...after Leonhard Euler,1707-1783, Swiss mathematician.
	VNEW ← MKEV(F,V);	"E" COMMAND.
	ENEW ← MKFE(V1,F,V2);	"J" COMMAND.
	VNEW ← ESPLIT(E);	"M" COMMAND.
	   E ← KLEV(VNEW);	"K" COMMAND.
	   F ← KLFE(ENEW);	"K" COMMAND.
	INVERT(E);
/

EXTERN GETBLK,RELBLK
EXTERN MKB,MKF,MKE,MKV,MKBFV
EXTERN KLB,KLF,KLE,KLV
EXTERN NCW.,PCW.,NCCW.,PCCW.
EXTERN ECW,ECW.,ECCW,ECCW.,OTHER,OTHER.
EXTERN BODY,FCW,FCCW,VCW,VCCW
SUBR(INVERT)	;AC-TRANSPARENT.
BEGIN	INVERT
	E←1
	DAC E,SAV#
	LAC E,ARG1
	FOR I⊂(1,3,4,5) {MOVSS I(E)↔}
	FOR I⊂(-3,-2,-1){MOVNS I(E)↔}
	LAC E,SAV
	RET1
BEND

;EVERT(B) - TO TURN INSIDE OUT.
SUBR(EVERT)
BEGIN EVERT
	ACCUMULATORS{B,E}
	CDR B,ARG1
	TEST B,BBIT↔RET1
	LAC E,B
L1:	PED E,E
	TEST E,EBIT↔GO L2
	MOVSS 1(E)
	MOVS  4(E)↔MOVS 1,5(E)
	DAC 1,4(E)↔DAC 5(E)
	GO L1
;...AND ALL THE PARTS OF THIS BODY.
L2:	PART 0,B↔JUMPL .+5
	PUSH P,B↔PUSH P,0↔PUSHJ P,EVERT↔POP P,B
	CDR (P)↔CAIE .-2↔RET1
	COPART B,B↔SKIPL E,B↔GO L1↔RET1
BEND
SUBR(MKEV)
BEGIN	MKEV
	ACCUMULATORS {VNEW,B,F,V,ENEW,E1,E2}
;CHECK FOR BAD ARGUMENTS.
	CDR VNEW,ARG1;FOR BAD RETURNS.
	LAC V,ARG1↔TEST(V,VBIT)↔RET2
	LAC F,ARG2↔TEST(F,FBIT)↔RET2
	NCNT 0,F↔SOSGE↔NCNT. 0,F;WIRE SWEEPING.
;CREATE A NEW EDGE AND VERTEX.
	SETQ(B,{BODY,V})
	SETQ(VNEW,{MKV,B})
	FOR @$ Qε{XYZ}{LAC Q$WC(V)↔DAC Q$WC(VNEW)↔}
	SETQ(ENEW,{MKE,B})
;MAKE FACE AND VERTEX LINKS.
	PED. 	ENEW,VNEW
	NFACE.	F,ENEW
	PFACE.	F,ENEW
	NVT.	VNEW,ENEW
	PVT.	V,ENEW
;CHECK FOR VERTEX BODY CASE.
	PED E1,F↔JUMPE E1,[
	PED. ENEW,F↔PED. ENEW,V
	CALL PCW.,ENEW,ENEW↔CALL NCCW.,ENEW,ENEW↔GO .+1]
;LOWER WINGS POINT AT SELF.
	CALL NCW.,ENEW,ENEW
	CALL PCCW.,ENEW,ENEW
;GET THE UPPER WINGS.
	PED E1,V↔LAC E2,E1
	NFACE 0,E1↔PFACE 1,E1
	CAMN 0,1↔GO L2
L1:	LAC E1,E2
	SETQ(E2,{ECW,E1,V})
	CALL FCW,E1,V
	CAME 1,F↔GO L1
;TIE ENEW TO ITS UPPER WINGS.
L2:	CALL PCW.,E1,ENEW
	CALL NCCW.,E2,ENEW
	RET2(VNEW)
BEND
;ENEW ← MKFE(V1,F,V2);		"J" COMMAND.
SUBR(MKFE)
BEGIN	MKFE
	ACCUMULATORS{V1,F,V2,FNEW,ENEW,E,E0,B,S12,N}

;FETCH THE ARGUMENTS.
	CDR V1,ARG3
	CDR  F,ARG2
	CDR V2,ARG1

;THE CREATIONS.
	SETQ(B,{BODY,F})
	SETQ(FNEW,{MKF,B})
	SETQ(ENEW,{MKE,B})

;SET F'S CNT POSITIVE WHEN NECESSARY.
	NCNT 0,F↔JUMPG .+5
	SOS↔MOVMS↔NCNT. 0,F↔NCNT. 0,FNEW

;LINK ENEW.
	PED. ENEW,F↔	PED. ENEW,FNEW
	PFACE. F,ENEW↔	NFACE. FNEW,ENEW
	PVT. V1,ENEW↔ 	NVT. V2,ENEW

;GET THE UPPER WINGS.
	PED E,V1↔LAC E0,E↔MOVS 1(E)↔CAME 1(E)
	GO[L1: LAC E0,E↔ SETQ(E,{ECW,E0,V1})
	CALL FCW,E0,V1↔CAME 1,F↔GO L1↔GO .+1]
	DAC E0,E1#↔DAC E,E2#

;GET THE LOWER WINGS.
	PED E,V2↔LAC E0,E↔MOVS 1(E)↔CAME 1(E)
	GO[L2: LAC E0,E↔ SETQ(E,{ECW,E0,V2})
	CALL FCW,E0,V2↔CAME 1,F↔GO L2↔GO .+1]
	DAC E0,E3#↔DAC E,E4#
;CDR V2'S TAIL REPLACING +F WITH FNEW.
	LIMZ N,1;PERIMETER COUNTER.
	LAC E,E3
L3:	PFACE 0,E
	NFACE 1,E
	CAME 1↔GO L4
	PFACE. FNEW,E
	AOS N
	PCW E,E
	GO L3

;CCW FROM V1 REPLACING F WITH FNEW.
L4:	LAC E0,E
	LAC E,E2
	CAMN E0,E2↔GO L6
L5:	NFACE 0,E
	CAME F,0
	GO[PFACE. FNEW,E↔GO .+2]
	   NFACE. FNEW,E
	AOS N
	CAME E,E0
	GO[SETQ(E,{ECCW,E,FNEW})↔GO L5]

;LINK THE WINGS.
L6:	CALL PCW.,E1,ENEW
	CALL NCCW.,E2,ENEW
	CALL NCW.,E3,ENEW
	CALL PCCW.,E4,ENEW

;UPDATE PERIMETER COUNTS WHEN NECESSARY.
	NCNT 0,FNEW
	JUMPN 0,L7
	NCNT. N,FNEW
	NCNT 0,F
	SUB  0,N
	ADDI 2
	NCNT. 0,F

L7:	RET3(ENEW)
	LIT
BEND
;VNEW ← ESPLIT(E);		"M" COMMAND.
SUBR(ESPLIT)
BEGIN	ESPLIT
	ACCUMULATORS{VNEW,ENEW,B,E,V}
;CHECK FOR BAD ARGUMENTS.
	CDR VNEW,ARG1
	LAC E,VNEW
	TEST E,EBIT↔GO L
	PVT V,E
;CREATE A NEW EDGE AND VERTEX.
	SETQ(B,{BODY,E})
	SETQ(VNEW,{MKV,B})
	SETQ(ENEW,{MKE,B})
	LAC AA(E)↔DAC AA(ENEW)
	LAC BB(E)↔DAC BB(ENEW)
	LAC CC(E)↔DAC CC(ENEW)
	LAC  7(E)↔DAC  7(ENEW)
;UPDATE V'S FIRST PTR WHEN NECESSARY.
	PED 0,V↔CAMN 0,E↔PED. ENEW,V
;PLACE VNEW BETWEEN E AND ENEW.
	PED. ENEW,VNEW
	PVT 0,E↔PVT. 0,ENEW
	PVT. VNEW,E
	NVT. VNEW,ENEW
	PFACE 0,E↔PFACE. 0,ENEW
	NFACE 0,E↔NFACE. 0,ENEW
;NEW UPPER WINGS ARE LIKE THE OLDE;
	PCW 0,E↔CALL PCW.,0,ENEW
	NCCW 0,E↔CALL NCCW.,0,ENEW
;EDGES POINT AT EACH OTHER ACROSS VNEW.
	CALL NCW.,E,ENEW
	CALL PCCW.,E,ENEW
L:	RET1(VNEW)
BEND 
;E ← KLEV(VNEW);		"K" COMMAND.
SUBR(KLEV)
BEGIN	KLEV
	ACCUMULATORS{E,ENEW,V,VNEW,F,B}
	CDR VNEW,ARG1
	PED ENEW,VNEW
	SETQ(E,{ECCW,ENEW,VNEW})
;ORIENT EDGES AS IN MANDALA.
	NVT 0,ENEW↔ CAMN 0,VNEW↔ GO .+3↔ CALL INVERT,ENEW
	PVT 0,E↔    CAMN 0,VNEW↔ GO .+3↔ CALL INVERT,E
;TIE E TO ITS NEW VERTEX.
	PVT V,ENEW↔ PVT. V,E
;MAKE E'S UPPER WINGS LIKE ENEW'S.
	PCW 0,ENEW↔	CALL PCW.,0,E
	NCCW 0,ENEW↔	CALL NCCW.,0,E
;ELIMINATE OCCURENCES OF ENEW IN F & V.
	PED 0,V↔ CAMN 0,ENEW↔ PED. E,V
	PFACE F,E↔ PED 0,F↔ CAMN 0,ENEW↔ PED. E,F
	NFACE F,E↔ PED 0,F↔ CAMN 0,ENEW↔ PED. E,F
;PURGE 'EM.
	PBODY B,ENEW
	CALL KLV,B,VNEW
	CALL KLE,B,ENEW
	RET1(E)
BEND
COMMENT .        \  pvt  /
                  \     /
            nccw   \   /   pcw
                    \ /
                  V  ⊗
                     |
                ENEW |
                     | nvt
                VNEW ⊗
                     | pvt
                   E |
                     |
                     ⊗
                    / \
             ncw   /   \   pccw
                  /     \
                 /  nvt  \.
;F ← KLFE(ENEW);		"K" COMMAND.
SUBR(KLFE)
BEGIN	KLFE
	ACCUMULATORS{F,ENEW,FNEW,V1,V2,E1,E2,E3,E4,S12,E,B}

;GET EVERYTHING.
	CDR ENEW,ARG1
	PFACE F,ENEW↔	NFACE FNEW,ENEW
	PVT V1,ENEW↔	NVT V2,ENEW
;GET THE WINGS.
	PCW  E1,ENEW
	NCCW E2,ENEW
	NCW  E3,ENEW
	PCCW E4,ENEW
;GET RID OF ENEW APPEARANCES IN F & V.
	PED 0,V1↔ CAMN 0,ENEW↔ PED. E1,V1
	PED 0,V2↔ CAMN 0,ENEW↔ PED. E3,V2
	PED 0,F ↔ CAMN 0,ENEW↔ PED. E3,F
;GET RID OF FNEW APPEARANCES
	LAC E,E2
L1:	PFACE 0,E↔CAMN 0,FNEW↔GO[PFACE. F,E↔GO L2]
	NFACE 0,E↔CAMN 0,FNEW↔GO[NFACE. F,E↔GO L2]
	FATAL(KLFE)
L2:	CAME E,E3↔GO[SETQ(E,{ECCW,E,F})↔GO L1]
;LINK WINGS TOGETHER ABOUT F.
	CALL ECCW.,E2,E1,F
	CALL ECCW.,E4,E3,F
;GET RID OF FNEW AND ENEW.
	PBODY B,ENEW
	CALL KLF,B,FNEW
	CALL KLE,B,ENEW
	RET1(F)
BEND
	

END